\clearpage

\section{框架整体设计}

本章将描述 WebSocket 服务器及客户端框架的整体设计思路和架构，通过图形展示工作原理和框架之间的联系。

\subsection{WebSocket 服务器框架}

WebSocket 服务器整体架构如图 \ref{server-structure} 所示。
\begin{figure}[htbp]
  \centering
  \includegraphics[width=.8\linewidth]{final/server-structure.png}
  \caption{服务器整体架构}
  \label{server-structure}
\end{figure}

WebSocket 的服务器框架实现主要分为三个部分：Socket 服务器部分，WebSocket 服务器部分，WebSocket 协议解析/拼装部分。其中 WebSocket 协议相关内容是所有 WebSocket 端点共用的部分，所以抽象出来以方便复用。

\par

Socket 服务器部分依赖于 Windows 的线程池 API、Windows 的 I/O 完成端口 API，Windows 异步 Socket API。在服务器启动时，创建好服务器端的 Socket 和相关上下文后，通过服务器统一的 I/O 事件处理回调函数等待线程池 I/O 从 Socket 中获取异步的 Accept 操作完成通知；服务器随后建立起新获取的 Socket 对应的上下文和线程池 I/O 结构，并在其上投递异步接收操作。Socket 服务器的数据发送也是基于线程池 I/O 的异步 Send 操作，发送数据缓冲区由相应发送操作的 I/O 上下文保存，其复制发生在调用服务器 Send 方法之前，并在收到发送操作完成通知时将其释放。

\par

WebSocket 服务器部分持有一个 Socket 服务器实例，并通过 Socket 服务器钩子来获取 Socket 断开/连接/接收等事件的通知。在获取到新的 Socket 连接时，WebSocket 服务器会为其创建一个 WebSocket 连接上下文，在其中记录当前 WebSocket 连接的状态，并对 WebSocket 的握手过程进行维护。WebSocket 接收缓冲区会将通过 Socket 服务器接收的字节流拼接成 WebSocket 帧，并交由 WebSocket 连接上下文里定义的回调函数处理。WebSocket 的上层应用可以通过 WebSocket 服务器提供的注册回调函数功能来自定义相应的行为。WebSocket 服务器也设置了默认的回调函数用以记录日志信息。WebSocket 服务器守护线程会检测来自 WebSocket 客户端的心跳包以判断其是否离线，并关闭 WebSocket 连接。

\subsection{WebSocket 客户端框架}

WebSocket 客户端框架相对服务器而言要更加简单，如图 \ref{client-structure} 所示。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=.65\linewidth]{final/client-structure.png}
  \caption{客户端整体结构}
  \label{client-structure}
\end{figure}

WebSocket 客户端与服务器类似，也分为三个部分，WebSocket 客户端，（Secure）Socket 客户端，和 WebSocket 协议实现。 其中 WebSocket 协议部分与服务器共用。

\par

WebSocket 客户端基于一个抽象的 Socket 客户端而实现，从而兼容是否需要 TLS 的不同版本。WebSocket 客户端通过回调函数通知使用者帧接收的相关信息，并维护一个守护线程，用来定时向 WebSocket 服务器发送 Ping 控制帧并检测服务器是否在规定时间内回复。数据接收使用 Socket 服务器提供的回调函数，将数据传入 WebSocket 接收缓冲区，根据 WebSocket 端点状态以及解析器状态将数据解析为 WebSocket 握手请求或者 WebSocket 帧。

\par

Socket 客户端使用的是同步的 Socket API，结构简洁，易用性高。Socket 客户端在 Socket API 上封装了数据接收操作，使用单独的接收线程阻塞于 recv 中，并通过注册的回调函数发送接收到的数据。